//mathe.h
//对math.h的补充
#pragma once
#include "math.h"
#include "../include/std.h"
#include "../include/const.h"

U64 Gcd(U64 a, U64 b);
//辗转相除法计算最大公约数。a、b必须大于零，没有参数合法性检测。

U64 PowerMod(U64 a, U64 p, U32 m);
/*快速模幂(幂模)算法。计算(a^p)%m的值。
有溢出保护。没有参数合法性检测，禁止输入0。
*/

int U64Bit(U64 a);
/*求整数的2进制位数，例如输入101返回3，10000返回5。未测试。
*/

int RootMod(U64 &power, U64 &index);
/*整数带余开方运算。未测试。
IN:
power	幂a
index	指数b
OUT:
power	底数的整数部分c。
index	余数d。
返回值：余数为0返回1，非0返回0。<0表示错误。
说明：a=c^b+d
*/

int IsPower(U64 u64Data);
/*判断u64Data是否可以表示成a^b的形式，a、b都是正整数，b>1。
* 如果可以返回指数，否则返回0
*/

U32 MATH_Ord(U64 a, U32 m);
/*返回a在m阶循环群中的指数，0表示无解
* 没有参数合法性检测，禁止输入0。
*/

U8 Gf256Mul(U8 a, U8 b,U16 u16Poly);
/*GF(256)上的乘法。未测试。
返回 a*b。
u16Poly是一个多项式参数，必须是不可约多项式。一般取0x011B
*/
